package Soligee.controller.facade.sessionFacadeImplements;

import Soligee.controller.facade.sessionFacade.SessionFacadeAlterar;
import Soligee.model.vo.lancamentos.NFEntradaVO;
import Soligee.model.vo.lancamentos.OrcamentoVO;
import Soligee.model.vo.lancamentos.ItensNFEntradaVO;
import Soligee.model.vo.lancamentos.ItensNFEntradaPKVO;
import Soligee.controller.bo.*;
import Soligee.model.persistencia.*;
import Soligee.model.vo.cadastros.*;
import Soligee.model.vo.lancamentos.BancoVO;
import Soligee.model.vo.lancamentos.ChequeVO;
import Soligee.model.vo.lancamentos.ItensCompraVO;
import Soligee.model.vo.lancamentos.ItensOrcamentoPKVO;
import Soligee.model.vo.lancamentos.ItensOrcamentoVO;
import Soligee.model.vo.lancamentos.PedidoCompraVO;
import java.io.IOException;
import java.util.Date;
import java.util.List;

public class SessionFacadeAlterarImplements implements SessionFacadeAlterar {

   public boolean alterarUsuario(int codUsuario, String login, int nivel, String senha, String nome) throws Exception {
      //cria usuario
      UsuarioVO usuario = new UsuarioVO(codUsuario, login, nivel, senha, nome);
      //cria dao
      DAO dao = new DAO(UsuarioVO.class);
      //instancia dao usuario e inclui no banco
      if (dao.update(usuario)) {
         return true;
      } else {
         return false;
      }
   }

   public boolean alterarRepresentante(int codRepresentante, String nome, String telefoneUm, String telefoneDois,
           String email, String paginaWeb, String caminhoImagem, Date dataCadastro,
           //parametros de Endereço

           int codEndereco, String rua, String bairro, String cep, String numero, String complemento,
           //parametros de Cidade

           int codCidade)
           throws Exception {

      boolean controlePessoa = false;
      boolean controleEndereco = false;

      String typeAdress = "residencial";

      RepresentanteVO representante = new RepresentanteVO(codRepresentante, nome, telefoneUm, telefoneDois, email, paginaWeb,
              caminhoImagem, dataCadastro);

      PessoaBO pbo = new PessoaBO();

      CidadeVO cidade = pbo.determinaCidade(codCidade);

      //Parametros da classe Endereço

      EnderecoVO end = new EnderecoVO(codEndereco, typeAdress, rua, bairro, cep, numero, complemento, representante, cidade);

      DAO dao = new DAO(PessoaVO.class);

      DAO dao2 = new DAO(EnderecoVO.class);

      controlePessoa = dao.update(representante);
      controleEndereco = dao2.update(end);

      //condicao para controle do retorno se atualizou com sucesso o relacionamento ou nao
      if ((controlePessoa == true) && (controleEndereco == true)) {
         return true;
      } else {
         return false;
      }
   }

   public boolean alterarPessoaFisica(
           //parametros Pessoa

           int casaPropria, int codPessoa,
           String nome, String telefoneUm, String telefoneDois, String telefoneTres, Date dataNasc, String rg, String email, String paginaWeb,
           String referencias, String cpf, String caminhoImagem, Date dataCadastro,
           String obs, String localTrab, double salario, int seprocado, String localNasc,
           //parametros de Endereço

           int codEndereco, int tipoEndereco, String rua, String bairro, String cep, String numero, String complemento,
           // parametros CidadeVO

           int codCidade)
           throws IOException, Exception {

      boolean controlePessoa = false;
      boolean controleEndereco = false;

      boolean haveHome;
      if (casaPropria == 1) {
         haveHome = true;
      } else {
         haveHome = false;
      }

      boolean isSeprocado;
      if (seprocado == 1) {
         isSeprocado = true;
      } else {
         isSeprocado = false;

      }

      String typeAdress;

      if (tipoEndereco == 1) {

         typeAdress = "residencial";

      } else {

         typeAdress = "comercial";

      }

      PessoaBO pbo = new PessoaBO();

      CidadeVO cidade = pbo.determinaCidade(codCidade);

      // if(pbo.validarCPF(cpf)){

      //Parametros da classe Pessoa Fisica

      PessoaFisicaVO pessoa = new PessoaFisicaVO(codPessoa, nome, telefoneUm, telefoneDois, telefoneTres, email, paginaWeb,
              caminhoImagem, dataCadastro, dataNasc, rg, cpf, haveHome, referencias, localTrab, isSeprocado, obs,
              localNasc, salario);

      //Parametros da classe Endereço

      EnderecoVO end = new EnderecoVO(codEndereco, typeAdress, rua, bairro, cep, numero, complemento, pessoa, cidade);

      DAO dao = new DAO(PessoaFisicaVO.class);

      DAO dao2 = new DAO(EnderecoVO.class);

      //Métodos de inclusão do DAO para inserçao de dados no BD

      controlePessoa = dao.update(pessoa);
      controleEndereco = dao2.update(end);


      //}
      //condicao para controle do retorno se atualizou com sucesso o relacionamento ou nao
      if ((controlePessoa == true) && (controleEndereco == true)) {
         return true;
      } else {
         return false;
      }

   }

   public boolean alterarPessoaJuridica(int codPessoa, String nome, String telefoneUm, String telefoneDois, String email,
           String paginaWeb, String caminhoImagem, Date dataCadastro, String razaoSocial, String cnpj, String inscEstadual,
           //parametros de Endereço
           int codEndereco, int tipoEndereco, String rua, String bairro, String cep, String numero, String complemento,
           // parametros CidadeVO
           int codCidade)
           throws Exception {

      boolean controlePessoa = false;
      boolean controleEndereco = false;

      String typeAdress;

      if (tipoEndereco == 1) {

         typeAdress = "residencial";

      } else {

         typeAdress = "comercial";

      }

      PessoaBO pbo = new PessoaBO();
      CidadeVO cidade = pbo.determinaCidade(codCidade);

      //  if (pbo.validaCnpj(cnpj)) {

      PessoaJuridicaVO pessoaJuri = new PessoaJuridicaVO(codPessoa, nome, telefoneUm, telefoneDois, email,
              paginaWeb, caminhoImagem, dataCadastro, razaoSocial, cnpj, inscEstadual);

      //Parametros de Endereço
      EnderecoVO endereco = new EnderecoVO(codEndereco, typeAdress, rua, bairro, cep, numero, complemento, pessoaJuri,
              cidade);

      DAO dao = new DAO(PessoaJuridicaVO.class);
      DAO dao2 = new DAO(EnderecoVO.class);

      controlePessoa = dao.update(pessoaJuri);
      controleEndereco = dao2.update(endereco);
      //}

      //condicao para controle do retorno se atualizou com sucesso o relacionamento ou nao
      if ((controlePessoa == true) && (controleEndereco == true)) {
         return true;
      } else {
         return false;
      }
   }

   public boolean alterarFornecedor(int codFornecedor, String nome, String telefoneUm, String telefoneDois, String email,
           String paginaWeb, String caminhoImagem, Date dataCadastro, String razaoSocial, String cnpj, String inscEstadual,
           String ramoAtividade,
           //parametros de Endereço
           int codEndereco, int tipoEndereco, String rua, String bairro, String cep, String numero, String complemento,
           // parametros CidadeVO
           int codCidade)
           throws Exception {

      boolean controlePessoa = false;
      boolean controleEndereco = false;

      PessoaBO pbo = new PessoaBO();

      CidadeVO cidade = pbo.determinaCidade(codCidade);

      String typeAdress;

      if (tipoEndereco == 1) {

         typeAdress = "residencial";

      } else {

         typeAdress = "comercial";

      }

      if (/*pbo.validaCnpj(cnpj)*/true) {

         FornecedorVO fornecedor = new FornecedorVO(codFornecedor, nome, telefoneUm, telefoneDois, email,
                 paginaWeb, caminhoImagem, dataCadastro, razaoSocial, cnpj, inscEstadual, ramoAtividade);

         EnderecoVO endereco = new EnderecoVO(codEndereco, typeAdress, rua, bairro, cep, numero, complemento, fornecedor,
                 cidade);

         DAO dao = new DAO(PessoaJuridicaVO.class);
         DAO dao2 = new DAO(EnderecoVO.class);

         controlePessoa = dao.update(fornecedor);
         controleEndereco = dao2.update(endereco);

      }

      //condicao para controle do retorno se atualizou com sucesso o relacionamento ou nao
      if ((controlePessoa == true) && (controleEndereco == true)) {
         return true;
      } else {
         return false;
      }
   }

   public boolean alterarOrcamento(int codVendedor, int codOrcamento, int codCliente, Date dataOrcamento,
           Date validadeProposta, int quantidadeProduto, int planoPagamento, double valorTotalVista, double valorTotalPrazo,
           String observacoes, List<ItensOrcamentoVO> listaItens, List<ProdutoVO> listaProdutos)
           throws Exception {

      SessionFacadeBuscarImplements facadeBusca = new SessionFacadeBuscarImplements();

      VendedorVO vendedor = (VendedorVO) facadeBusca.buscaPorCodigo(VendedorVO.class, "codVendedor", codVendedor).iterator().next();

      PessoaVO pessoa = (PessoaVO) facadeBusca.buscaPorCodigo(PessoaVO.class, "codPessoa", codCliente).iterator().next();


      OrcamentoVO orcamento = new OrcamentoVO(vendedor, pessoa, codOrcamento, dataOrcamento, validadeProposta,
              quantidadeProduto, planoPagamento, valorTotalVista, valorTotalPrazo, observacoes);


      DAO dao = new DAO(OrcamentoVO.class);

      ItensOrcamentoVO itensnorcamento = new ItensOrcamentoVO();
      boolean verifica2 = dao.update(orcamento);

      boolean verifica = false;

      int controle = 0;

      for (int i = 0; i < listaItens.size(); i++) {

         //definindo a chave composta para itensnotafiscal
         ItensOrcamentoPKVO chavecomposta = new ItensOrcamentoPKVO();

         //seta a chave composta
         chavecomposta.setProduto(listaProdutos.get(i));

         chavecomposta.setOrcamento(orcamento);

         //cria o item
         itensnorcamento = listaItens.get(i);

         //seta a chave composta criada para o item
         itensnorcamento.setChaveComposta(chavecomposta);

         //instancia um dao para ItensOrcamentoVO.class
         DAO dao3 = new DAO(ItensOrcamentoVO.class);

         //inclui itemnf no banco e retorna um boolean
         verifica = dao3.update(itensnorcamento);

         controle++;
      }

      if (verifica && verifica2) {
         return true;
      } else {
         return false;
      }
   }

   public boolean alterarProduto(int codSubcategoria, int codCategoria, int codMarca, int codProduto, String descricao,
           String unidade, double qtdadeEstoque, double quantidadeMinima, double precoCusto, double precoVenda,
           double percentualVenda) throws Exception {

      //cria facade busca para realizacao das mesmas
      SessionFacadeBuscarImplements facadeBusca = new SessionFacadeBuscarImplements();

      //busca no bd a categoria de acordo com o codigo passado
      CategoriaVO categoria = (CategoriaVO) facadeBusca.buscaPorCodigo(CategoriaVO.class, "codCategoria", codCategoria).iterator().next();

      //busca no bd a subcategoria de acordo com o codigo passado
      SubcategoriaVO subcategoria = (SubcategoriaVO) facadeBusca.buscaPorCodigo(SubcategoriaVO.class, "codSubCategoria", codSubcategoria).iterator().next();

      //busca no bd a marca de acordo com o codigo passado
      MarcaVO marca = (MarcaVO) facadeBusca.buscaPorCodigo(MarcaVO.class, "codMarca", codMarca).iterator().next();

      //cria o produto para ser alterado
      ProdutoVO produto = new ProdutoVO(codProduto, descricao, unidade, qtdadeEstoque,
              quantidadeMinima, precoCusto, precoVenda, categoria, subcategoria,
              marca, percentualVenda);

      //cria o dao para cadastro
      DAO dao = new DAO(ProdutoVO.class);
      //update o produto no banco

      if (dao.update(produto)) {
         return true;
      } else {
         return false;
      }
   }

   public boolean alterarVendedor(int codVendedor, String nome, double comissaoVendaPrazo, double comissaoVendaVista) throws Exception {
      VendedorVO vendedor = new VendedorVO(codVendedor, nome, comissaoVendaPrazo, comissaoVendaVista);
      DAO dao = new DAO(VendedorVO.class);
      if (dao.update(vendedor)) {
         return true;
      } else {
         return false;
      }
   }

   public boolean alterarNFEntrada(int codNFEntrada, Date data_emissao, Date data_entrada, int numero_nf,
           int qtdadeParcela, double percentualIPI, double percentual_frete, double percentual_desconto,
           double percentual_embalagem, double valortotal_produto, double valortotal_nota, int codFornecedor,
           //Listas auxiliares
           List<ItensNFEntradaVO> listaItens, List<ProdutoVO> listaProdutos) throws IOException, Exception {
     
      //busca para preencher corretamente com os dados do fornecedor
      SessionFacadeBuscarImplements facadeBusca = new SessionFacadeBuscarImplements();

      FornecedorVO fornec = (FornecedorVO) facadeBusca.buscaPorCodigo(FornecedorVO.class, "codPessoa", codFornecedor).iterator().next();

      NFEntradaVO nfentrada = new NFEntradaVO(codNFEntrada, data_emissao, data_entrada, numero_nf, qtdadeParcela, percentualIPI,
              percentual_frete, percentual_desconto, percentual_embalagem, valortotal_produto, valortotal_nota, fornec);

      DAO dao = new DAO(NFEntradaVO.class);
      boolean verifica = false;
      boolean verifica2 = dao.update(nfentrada);

      int controle = 0;

      ItensNFEntradaVO itensnfentrada = new ItensNFEntradaVO();

      for (int i = 0; i < listaItens.size(); i++) {

         //definindo a chave composta para itensnotafiscal
         ItensNFEntradaPKVO chavecomposta = new ItensNFEntradaPKVO();

         //seta a chave composta
         chavecomposta.setProduto(listaProdutos.get(i));
         chavecomposta.setNfentrada(nfentrada);

         //cria o item
         itensnfentrada = listaItens.get(i);
         //seta a chave composta criada para o item

         itensnfentrada.setChaveComposta(chavecomposta);

         //instancia um dao para NFEntradaVO.class
         DAO dao2 = new DAO(ItensNFEntradaVO.class);

         //inclui itemnf no banco e retorna um boolean
         verifica = dao2.update(itensnfentrada);

         controle++;

      }
      if (verifica && verifica2) {
         return true;
      } else {
         return false;
      }
   }

   public boolean alterarPedido(int codPedido, int codFornecedor, int codRepresentante, Date dataEmissao, Date dataRecebimento,
           int codFormaPgto, double percentFrete, double percentDesc, double percentEmbalagem, double valorTotalItens,
           double valorTotalPedido,
           //lista com os items de pedido
           List<ItensCompraVO> listaItens) throws Exception {

      SessionFacadeBuscarImplements facadeBusca = new SessionFacadeBuscarImplements();
      try {
         PedidoCompraVO pedido = new PedidoCompraVO();

         pedido = new PedidoCompraVO(codPedido, dataEmissao,dataRecebimento,codFornecedor, codRepresentante, codFormaPgto,
                 percentFrete,percentDesc,percentEmbalagem, valorTotalItens,valorTotalPedido);
         pedido.setItenscompra(listaItens);
         DAO dao = new DAO(PedidoCompraVO.class);
         dao.update(pedido);
         return true;
      } catch (Exception e) {
         System.out.println(e.getMessage());
         e.printStackTrace();
         return false;
      }/*boolean verifica=false;
   boolean verifica2=dao.update(pedido);

   for(int i =0; i < listaItens.size(); i++){

   //inclui itemnf no banco e retorna um boolean
   DAO dao2 = new DAO(ItensCompraVO.class);

   verifica=dao2.update(listaItens.get(i));

   }
   if(verifica&&verifica2)
   return true;
   else
   return false;
   }*/
   }

   public boolean alterarCategoria(int codCategoria, int codMarca, String descricao, Double comissaoVenda) throws Exception {

      //busca para preencher corretamente com os dados do fornecedor
      SessionFacadeBuscarImplements facadeBusca = new SessionFacadeBuscarImplements();

      //busca no bd a marca de acordo com o codigo passado
      MarcaVO marca = (MarcaVO) facadeBusca.buscaPorCodigo(MarcaVO.class, "codMarca", codMarca).iterator().next();

      CategoriaVO categoria = new CategoriaVO(codCategoria, marca, descricao, comissaoVenda);

      DAO dao = new DAO(CategoriaVO.class);
      //instancia dao usuario e inclui no banco

      dao.update(categoria);

      return true;
   }

   public boolean alterarSubcategoria(int codSubcategoria, int codCategoria, String descricao) throws Exception {

      //busca para preencher corretamente com os dados do fornecedor
      SessionFacadeBuscarImplements facadeBusca = new SessionFacadeBuscarImplements();

      //busca no bd a marca de acordo com o codigo passado
      CategoriaVO categoria = (CategoriaVO) facadeBusca.buscaPorCodigo(CategoriaVO.class, "codCategoria", codCategoria).iterator().next();


      SubcategoriaVO subcategoria = new SubcategoriaVO(codSubcategoria, descricao, categoria);

      DAO dao = new DAO(SubcategoriaVO.class);

      dao.update(subcategoria);

      return true;
   }

   public boolean alterarMarca(int codMarca, String descricao) throws Exception {

      MarcaVO marca = new MarcaVO(codMarca, descricao);

      DAO dao = new DAO(MarcaVO.class);

      if (dao.update(marca)) {
         return true;
      } else {
         return false;
      }
   }
   public boolean alterarParcelaNF(ParcelaNFEntradaVO parcelaNF) throws Exception {

      DAO dao = new DAO(ParcelaNFEntradaVO.class);

      if (dao.update(parcelaNF)) {
         SessionFacadeCadastrarImplements facadeCadastrar = new SessionFacadeCadastrarImplements();
         facadeCadastrar.cadastrarLancamentoCaixa("Pagamento de parcela, referente a NF n° " + parcelaNF.getNfEntrada().getCodNFEntrada(), parcelaNF.getValorParcela(), 0, 2);
         return true;
      } else {
         return false;
      }
   }
   public boolean alterarConta(ContaVO conta) throws Exception {

      DAO dao = new DAO(ContaVO.class);

      if (dao.update(conta)) {
          SessionFacadeCadastrarImplements facadeCadastrar = new SessionFacadeCadastrarImplements();
         facadeCadastrar.cadastrarLancamentoCaixa("Pagamento de Conta, referente a conta n° " + conta.getCodConta(), conta.getValorConta(), 0, 2);
         return true;
      } else {
         return false;
      }
   }
      public boolean alterarBanco(int codBanco, String nome_banco, boolean ativo) throws Exception{
         BancoVO banco = new BancoVO(codBanco, nome_banco, ativo);
         DAO dao = new DAO(BancoVO.class);

         if(dao.update(banco)){
            return true;
         }else{
            return false;
         }
      }
      public boolean alterarCheque(int codCheque,String agencia,String numConta, String numCheque, int situaco, String emitente, String obsReferente, Date dataLancamento, Date dataDeposito, double valor,int codBanco) throws Exception{
         BancoVO banco = (BancoVO) new SessionFacadeBuscarImplements().buscaPorCodigo(BancoVO.class, "cod_banco", codBanco).iterator().next();

         ChequeVO cheque = new ChequeVO(codCheque,numConta ,agencia, numCheque, situaco, emitente, obsReferente, dataLancamento, dataDeposito, valor, banco);
         DAO dao = new DAO(ChequeVO.class);

         if(dao.update(cheque)){
            return true;
         }else{
            return false;
         }
      }

    public boolean alterarParcelaVenda(ParcelaVendaVO parcelaVenda) throws Exception {
        DAO dao = new DAO(ParcelaVendaVO.class);
        if (dao.update(parcelaVenda)) {
            SessionFacadeCadastrarImplements facadeCadastrar = new SessionFacadeCadastrarImplements();
            facadeCadastrar.cadastrarLancamentoCaixa("Recebimento de parcela, referente a venda n° " + parcelaVenda.getVenda().getCodVenda(), 0, parcelaVenda.getValorParcela(), 1);
            return true;
        }
        else {
            return false;
        }
    }




    
   }
